package com.he.hsdyc.designmodule.single;

//使用静态内部类实现单例模式--线程安全
class SingletonStaticInner {
    private SingletonStaticInner() {

    }

    //静态内部类不会被立即加载，只有类的静态成员被调用时才会发生，相当于懒加载
    private static class SingletonInner {
        //JVM保证类的静态成员只能被加载一次实现单例
        private static SingletonStaticInner singletonStaticInner = new SingletonStaticInner();
    }
    public static SingletonStaticInner getInstance() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return SingletonInner.singletonStaticInner;
    }
}


//可以看到使用这种方式我们没有显式的进行任何同步操作，那他是如何保证线程安全呢？
//和饿汉模式一样，是靠JVM保证类的静态成员只能被加载一次的特点，这样就从JVM层面保证了只会有一个实例对象。
//那么问题来了，这种方式和饿汉模式又有什么区别呢？不也是立即加载么？实则不然，加载一个类时，其内部类不会同时被加载。
//一个类被加载，当且仅当其某个静态成员（静态域、构造器、静态方法等）被调用时发生。
//可以说这种方式是实现单例模式的最优解。
